VBcrackme 解析手引き「VBCrack1」


はじめに、VBCrack1を直に実行してみましょう。
@ 起動時に5秒間表示
A 起動10秒後に表示
B 終了時に表示
と合計3つのナグが表示されます。
補助ツール ExDec(VB DeComplier)で、P-Codeリストは作成してますね?
まだなら今のうちです。

ここは、続けます。
WKTVBDE を起動します。
VBCrack1.exe を読込みます。
すばやく「Action」→「Run」又は、ツールバーの「Run」で実行します。
VBCrack1.exeがロードされて、最初に実行されるP-Code命令でブレークします。

ここで余談
前回・前々回のVBCrack2と、VBXrack3では、「Run」直後に対象APのウィンドウがすぐに表示されました。
今回の、VBCrack1では、ウィンドウ表示前にWKTVBDEでブレークします。
「Run」直後に、ブレークする場合としない場合の違いは、解析対象APがウィンドウを表示する前に、
実行コードの有無により変ります。

本題に戻りまして、
ExDecで作成した、P-Codeリストを見ると、

402EB8: 24 NewIfNullPr 4014c8 (frmSplash)
402EBB: 0d VCallHresult meth__imethSHOW

上記、2行でfrmSplashフォームを表示(ウィンドウの表示)を行っています。
0x402EBBにブレークポイントを設定して、「Go!(F5)」で実行します。

0x402EBBでブレークします。
ここで、WKTVBDEのP-Codeリストを見ると、

402EC5: f5 LitI4: 0x1388 5000
402ECA: 0a ImpAdCallFPR4 kernel32!Sleep
402ECF: 3c SetLastSystemError ← APIコールの結果取得

と5秒のスリープ処理があります。
0x402EB8 〜 0x402ECF で1つ目のナグ表示処理を行っています。

さて、1つ目のナグ消しパッチを作ります。
パッチ位置は、今ブレークしている 0x402EBB(ファイルオフセット:0x2EBB)
Branch(0x1e)命令を使用して、ナグ表示処理をスキップします。

ブランチ先は、「402ECF: 3c SetLastSystemError」の後、「402ED0: 05 ImpAdLdRf」に飛ばすようにします。
ブランチオフセットの計算 0x402ED0(ブランチ先) - 0x402E3C(コードの先頭) = 0x94 となります。
パッチイメージは、 0x1e 0x94 0x00 となりますが、ここでパッチ元のP-Code(WKTVBDEにOp: xx xx と表示)
を見ると、0x0d 0xb0 0x02 0x07 0x00 と5バイトとなってます。
このまま3バイトパッチを当てると、後ろ2バイトがP-Codeと解釈され誤動作の可能性がありそうです。
ここで、2バイトのP-Codeをダミーで追加します。

Opcodes(Ctrl+O)を参照し、LargeBos(0x00)の2バイト命令を使用します。
(この命令は、何をしているか分かりませんが、実行されない部分なので問題無いでしょう。)
よって、5バイトのパッチイメージは、 0x1e 0x94 0x00 0x00 0x00 となります。

それでは、コードの書換えを行います。
WKTVBDEの「Edit」ボタンをクリックします。
「Memort viewer and editor」ウィンドウが表示されます。
コードを変更するには、ダンプ部分をWクリックする必要があります。
0x00402EBB と表示されてる部分をWクリックします。
すると、数値が入力出来る様になりましたね。
0x0d 0xb0 0x02 0x07 0x00 → 0x1e 0x94 0x00 0x00 0x00 に変更して、「Patch Now」ボタンをクリックします。
WKTVBDEのP-Code表示が、

402EBB: 1E Branch 00402ED0 (Jump)
402EBE: 00 LargeBos

と表示が変りました。
次は、

402EF8: 24 NewIfNullPr 401738 (frmMain)
402EFB: 0d VCallHresult meth__imethSHOW

frmMainフォームを表示部分、0x402EFB にブレークポイントを設定して処理を続けます。
この時に、最初のナグが表示されないのを確認します。

「Step Trace(F8)」で、1ステップ実行すると、
WKTVBDEのP-Code表示が、frmMainフォームのロード処理に切替わります。
ここであわてずに、「Step Trace(F8)」で、0x402C78: 13 ExitProcHresult を実行するまで進めると、

402EF8: 24 NewIfNullPr 401738 (frmMain)
402EFB: 0d VCallHresult meth__imethSHOW
402F00: f5 LitI4: 0x2710 10000 ← ここに戻る。

また、ここでWKTVBDEのP-Code表示を見ると、

402F14: 0d VCallHresult put ipropINTERVALTIMER
402F2D: 0d VCallHresult put ipropENABLEDTIMER

と、xxxxTIMERコールする箇所があります。
ここで注目する箇所は、「402F2D: 0d VCallHresult put ipropENABLEDTIMER」です。
ここで、Timerの有効無効の設定を行っています。

402F1C: f4 LitI2_Byte: 0xff 255

この値は、VBのtrue値です。
起動10秒後に表示されるナグは、Timerを使って表示しています。
よって、このTimerを無効(false)にする事で、回避する事ができますね。
パッチイメージは、「402F1C: f4 LitI2_Byte: 0xff 255」の 0xff を 0x00 に変更します。
「Step Trace(F8)」等を使用して、カーソルが 0x402F1C にくるまで、実行させます。
次に、「Edit」ボタンをクリックして、0xf4 0xff の2バイト目を、0x00 に変更します。
ファイルオフセット値は、0x2F1Dとなります。

さて、3つ目のナグ消しに入ります。
「Form Manager(Ctrl+F)」で、「Form Manager」ウィンドウを表示します。
「Command」をクリック、さらに「▼」をボタンクリックして、「cmdQuit」を選択します。
そして、「BPX」ボタンをクリックして、ブレークポイントを設定します。
「Go!(F5)」で、実行します。
ここで、10秒ほど放置してナグが表示されない事を確認しましょう。

「終了」ボタンを、クリックします。
さきほど設定したブレークポイントで止まります。

402B39: 0d VCallHresult CVBApplication::Unload 

にカーソルがくるまで実行させます。
「Step Trace(F8)」で、ステップ実行します。
WKTVBDEのP-Codeが、Unloadの処理に切替わります。

402BD0: 27 LitVar_Missing 0012F230h
402BD3: 27 LitVar_Missing 0012F250h
402BD6: 27 LitVar_Missing 0012F270h
402BD9: f5 LitI4: -> 0x0 0
402BDE: 3a LitVarStr: '3個目のNag(修了時に表示)'
402BE3: 4e FStVarCopyObj 0012F290h
402BE6: 04 FLdRfVar 0012F290h
402BE9: 0a ImpAdCallFPR4: rtcMsgBox on address 660E1FF2h
402BEE: 36 FFreeVar -> 4
402BF9: 13 ExitProcHresult

と上記の様に表示されます。(何度も言いますが、漢字表示部分は、Win9x系OSでは化けてます。)
この処理でのナグ表示は、

402BE9: 0a ImpAdCallFPR4: rtcMsgBox on address 660E1FF2h

です。
カーソルが、0x402BE9 にくるまで実行させます。

今回も、1個目のナグ消しの要領で表示命令を、ブランチ命令に変更します。
ブランチ先は、「0x402BEE: 36 FFreeVar -> 4」になるようにオフセットを計算します。
0x402BEE - 0x402BD0 = 0x1e
書換え側の命令は5バイトなので、後ろ2バイトを0x00にして、

0x1e 0x1e 0x00 0x00 0x00

となります。
ファイルオフセットは、0x2be9 ですね。
それでは、コードを変更して、「Go!(F5)」!
ナグでないのを確認してみて下さい。
「 Debugging session finished. 」とWKTVBDEが言ってきたら成功です。

今回のパッチ・イメージ張りつけます。

00002BE9: 0A 1E
00002BEA: 0D 1E
00002BEC: 14 00
00002EBB: 0D 1E
00002EBC: B0 94
00002EBD: 02 00
00002EBE: 07 00
00002F1D: FF 00

これは、1例に過ぎないと思います。
参考として、二個目のナグ部分は ブランチ を使って

2F00: F5 1E
2F01: 10 F9
2F02: 27 00

とパッチすると、Timerの処理をスキップになります。



これで、VBcrackmeは全て終了しました。長らくお付き合い下さりありがとうございました!